iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0

上一篇漏掉了一個主類別的函數:

void anotherInstanceStarted (const String& commandLine) override
{
}

以 Windows 系統為例,執行檔 .exe 被重覆執行時,會有多個 Process 產生。而 anotherInstanceStarted 這支 Callback 函數當「條件」滿足時,會被呼叫。

預設情況下,JUCE 程式可以同時運行。不過,有時候會限制同時間只有一支程式執行。要達到這個目的,只要修改主類別中的 moreThanOneInstanceAllowed() 函數回傳值,由 true 改成 false

class SamGUIApplicationApplication  : public juce::JUCEApplication
{
public:
  SamGUIApplicationApplication() {}
  
  bool moreThanOneInstanceAllowed() override { return false; }
};

上述改動編譯後,同支程式被執行第二次時,anotherInstanceStarted() 會被呼叫,而 commandLine 參數是第二次執行時指示的參數。例如:

demo.exe
demo.exe 2ndArg

anotherInstanceStarted() 會被呼叫,而 commandLine 的值為「2ndArg」。

不少應用程式只允許一個 Process 存在,JUCE 只要改動一個地方即可達到目的。輕鬆愜意。

前述幾個函數是 JUCE GUI Application 的核心,接下來是視窗應用程式中,負責「視窗」顯示的核心。

SamGUIApplicationApplication class 內含了一個 MainWindow class,繼承自 juce::DocumentWindowMainWindow 負責下圖中,紅框以外的區域:

上圖中的系統按鈕(關閉、縮小、最大化),以及視窗大小是否可變,預設視窗大小,是否以全螢幕的方式呈現,是否要隱藏等邏輯,通通由 MainWindow 負責。其預設建構式如下:

MainWindow (String name)
    : DocumentWindow (name,
                      Desktop::getInstance().getDefaultLookAndFeel()
                                                  .findColour (ResizableWindow::backgroundColourId),
                      DocumentWindow::allButtons)
{
    setUsingNativeTitleBar (true);
    setContentOwned (new MainComponent(), true);

   #if JUCE_IOS || JUCE_ANDROID
    setFullScreen (true);
   #else
    setResizable (true, true);
    centreWithSize (getWidth(), getHeight());
   #endif

    setVisible (true);
}

底下列出幾個重點說明。JUCE 的視窗風格有兩種,一種是符合系統原生外觀樣式(如上圖);另一種是 JUCE 自有風格,如下:

只要將 MainWindow 建構式中的 setUsingNativeTitleBar 參數改成 false,表示不使用原生(Native)的視窗風格。


上一篇
Day 6:JUCE 框架基本架構
下一篇
Day 8:學習資源哪裡找?
系列文
JUCE 入門 @ 跨平台應用程式開發使用 C++29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言